package com.kwt.learn.map;

import java.util.HashMap;

/**
 * 讨论hash算法的实现，为什么要用高16位和低16位 ^
 */
public class HashAlgorithm {

    public static void main(String[] args) {
        HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
        String a = "Aa";
        System.out.println(Integer.toBinaryString(a.hashCode()));
        System.out.println(Integer.toBinaryString(a.hashCode() >>> 16));
        System.out.println(Integer.toBinaryString(a.hashCode() ^ (a.hashCode() >>> 16)));
        objectObjectHashMap.put("Aa", "");

    }
}
//    hash函数源代码
//    static final int hash(Object key) {
//        int h;
//        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
//    }


/**
 * 0000 0000 0000 0000 0000 1000 0100 0000   100001000000
 * 0000 0000 0000 0000 0000 0000 0000 0000   100001000000 >>>16
 * ^ 位运算 位比较，只有一个是1，结果为1，因为^运算在很大程度上能够保留高16位和低16位的共同特征
 * 0000 0000 0000 0000 0000 1000 0100 0000
 */

/**
 * 1、 >>> 16  使用hashCode无符号右移16位的作用是能够保证hash值的低16位中，保留了hashCode的高16位和hashCode的低16位的特性；
 *             而这么做的原因是：后边寻址过程中要使用 hash & (tab.length-1),由于tab.length-1在一般使用场景中是一个很小的值，
 *             基本上高16位都是0000 0000 0000 0000，如果hash丢弃掉hashCode的高16位特性，那么hash冲突的几率就会变大
 * 2、 ^       为什么使用异或运算，
 */
